package com.example.his.api.mis.impl;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import com.example.his.api.common.PageUtils;
import com.example.his.api.db.dao.UserDao;
import com.example.his.api.mis.service.UserService;
import com.example.his.api.db.pojo.UserEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
  @Resource
  private UserDao userDao;

  @Override
  public Integer login( Map param ) {
    String username = MapUtil.getStr( param, "username" );
    String password = MapUtil.getStr( param, "password" );
    MD5 md5 = MD5.create();
    String temp = md5.digestHex( username );
    String tempStart = StrUtil.subWithLength( temp, 0, 6 );
    String tempEnd = StrUtil.subSuf( temp, temp.length() - 3 );
    password = md5.digestHex( tempStart + password + tempEnd ).toUpperCase();
    param.replace( "password", password );
    Integer userId = userDao.login( param );
    return userId;
  }

  //  更新密码
  @Override
  public int updatePassword( Map param ) {
    // 获取用户ID和用户名
    int userId = MapUtil.getInt( param, "userId" );
    String username = userDao.searchUsernameById( userId );

    // 创建MD5加密实例并生成密码混淆值
    MD5 md5 = MD5.create();
    String password = MapUtil.getStr( param, "password" );
    String temp = md5.digestHex( username );
    String tempStart = StrUtil.subWithLength( temp, 0, 6 );
    String tempEnd = StrUtil.subSuf( temp, temp.length() - 3 );

    // 加密旧密码并更新到参数表
    password = md5.digestHex( tempStart + password + tempEnd ).toUpperCase();
    param.replace( "password", password );

    // 获取并加密新密码
    String newPassword = MapUtil.getStr( param, "newPassword" );
    newPassword = md5.digestHex( tempStart + newPassword + tempEnd ).toUpperCase();
    param.replace( "newPassword", newPassword );

    // 调用DAO层更新密码
    int rows = userDao.updatePassword( param );
    return rows;
  }

  /**
   * 分页查询用户信息
   *
   * @param param 查询参数，包含page（当前页码）、length（每页记录数）等分页信息
   * @return PageUtils 分页结果封装对象，包含总记录数、当前页数据等信息
   */
  @Override
  public PageUtils searchByPage( Map param ) {

    // 查询用户列表数据
    ArrayList < HashMap > list = new ArrayList <>();
    // 获取符合条件的用户总数
    Long count = userDao.searchCount( param );
    // 如果总数大于0，则查询当前页的用户数据
    if ( count > 0 ) {
      list = userDao.searchByPage( param );
    }
    // 从参数中获取当前页码和每页记录数
    Integer page = MapUtil.getInt( param, "page" );
    Integer length = MapUtil.getInt( param, "length" );
    // 封装分页结果
    PageUtils pageUtils = new PageUtils( list, count, page, length );

    return pageUtils;
  }

  /**
   * 新增用户信息
   *
   * @param user 用户实体对象，包含用户名、密码等信息
   * @return int 影响的行数，1表示插入成功，0表示插入失败
   */
  @Override
  @Transactional
  public int insert( UserEntity user ) {
    // 创建MD5加密实例
    MD5 md5 = MD5.create();

    // 对用户名进行MD5加密，用于生成密码混淆值
    String temp = md5.digestHex( user.getUsername() );
    // 截取加密后的前6位作为混淆值的前缀
    String tempStart = StrUtil.subWithLength( temp, 0, 6 );
    // 截取加密后的后3位作为混淆值的后缀
    String tempEnd = StrUtil.subSuf( temp, temp.length() - 3 );

    // 获取用户原始密码，并进行混淆加密处理
    String password = md5.digestHex( tempStart + user.getPassword() + tempEnd ).toUpperCase();
    // 将加密后的密码设置回用户对象
    user.setPassword( password );

    // 调用DAO层插入用户数据
    int rows = userDao.insert( user );
    return rows;
  }

  /**
   * @param userId
   * @return
   */
  @Override
  public HashMap searchById( int userId ) {

    HashMap map = userDao.searchById( userId );
    return map;
  }

  /**
   * @param param
   * @return
   */
  @Override
  @Transactional
  public int update( Map param ) {

    int rows = userDao.update( param );
    return rows;
  }

  /**
   * @param ids
   * @return
   */
  @Override
  public int deleteByIds( Integer[] ids ) {
    int rows = userDao.deleteByIds( ids );
    return rows;
  }

  /**
   * @param userId
   * @return
   */
  @Override
  public int dismiss( int userId ) {

    int rows = userDao.dismiss( userId );
    return rows;
  }
}

